--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / public / rnode-flasher / js / nrf52_dfu_flasher.js
Displaying Raw • Download
meshchatx/src/frontend/public/rnode-flasher/js/nrf52_dfu_flasher.js c005017cbaf0102ba2fcfbcd2df970cf31e4452f (c005017c) Text, 12.92 KB
T8b949e/**
* A Web Serial based nRF52 flasher written by liam@liamcottle.com based on dfu_transport.serial.py
* https://github.com/adafruit/Adafruit_nRF52_nrfutil/blob/master/nordicsemi/dfu/dfu_transport_serial.py
*/
Tff7b72class Te6edf3Nrf52DfuFlasher Tb4b4b4{
Te6edf3DFU_TOUCH_BAUD Tff7b72= T79c0ff1200Tb4b4b4;
Te6edf3SERIAL_PORT_OPEN_WAIT_TIME Tff7b72= T79c0ff0.1Tb4b4b4;
Te6edf3TOUCH_RESET_WAIT_TIME Tff7b72= T79c0ff1.5Tb4b4b4;
Te6edf3FLASH_BAUD Tff7b72= T79c0ff115200Tb4b4b4;
Te6edf3HEX_TYPE_APPLICATION Tff7b72= T79c0ff4Tb4b4b4;
Te6edf3DFU_INIT_PACKET Tff7b72= T79c0ff1Tb4b4b4;
Te6edf3DFU_START_PACKET Tff7b72= T79c0ff3Tb4b4b4;
Te6edf3DFU_DATA_PACKET Tff7b72= T79c0ff4Tb4b4b4;
Te6edf3DFU_STOP_DATA_PACKET Tff7b72= T79c0ff5Tb4b4b4;
Te6edf3DATA_INTEGRITY_CHECK_PRESENT Tff7b72= T79c0ff1Tb4b4b4;
Te6edf3RELIABLE_PACKET Tff7b72= T79c0ff1Tb4b4b4;
Te6edf3HCI_PACKET_TYPE Tff7b72= T79c0ff14Tb4b4b4;
Te6edf3FLASH_PAGE_SIZE Tff7b72= T79c0ff4096Tb4b4b4;
Te6edf3FLASH_PAGE_ERASE_TIME Tff7b72= T79c0ff0.0897Tb4b4b4;
Te6edf3FLASH_WORD_WRITE_TIME Tff7b72= T79c0ff0.0001Tb4b4b4;
Te6edf3FLASH_PAGE_WRITE_TIME Tff7b72= Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_SIZE Tff7b72/ T79c0ff4Tb4b4b4) Tff7b72* Tff7b72thisTb4b4b4.Te6edf3FLASH_WORD_WRITE_TIMETb4b4b4;
T8b949e// The DFU packet max size
Te6edf3DFU_PACKET_MAX_SIZE Tff7b72= T79c0ff512Tb4b4b4;
Tff7b72constructorTb4b4b4(Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3serialPort Tff7b72= Te6edf3serialPortTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sequenceNumber Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sd_size Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3total_size Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Waits for the provided milliseconds, and then resolves.
* @param millis
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sleepMillisTb4b4b4(Te6edf3millisTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3setTimeoutTb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3millisTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Writes the provided data to the Serial Port.
* @param data
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sendPacketTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3writer Tff7b72= Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3writableTb4b4b4.Te6edf3getWriterTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3writerTb4b4b4.Te6edf3writeTb4b4b4(Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Te6edf3writerTb4b4b4.Te6edf3releaseLockTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Puts an nRF52 board into DFU mode by quickly opening and closing a serial port.
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3enterDfuModeTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// open port
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3openTb4b4b4(Tb4b4b4{
Te6edf3baudRateTff7b72: Tff7b72thisTb4b4b4.Te6edf3DFU_TOUCH_BAUDTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// wait SERIAL_PORT_OPEN_WAIT_TIME before closing port
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3SERIAL_PORT_OPEN_WAIT_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
T8b949e// close port
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// wait TOUCH_RESET_WAIT_TIME for device to enter into DFU mode
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3TOUCH_RESET_WAIT_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Flashes the provided firmware zip.
* @param firmwareZipBlob
* @param progressCallback
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3flashTb4b4b4(Te6edf3firmwareZipBlobTb4b4b4, Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
T8b949e// read zip file
Tff7b72const Te6edf3blobReader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3BlobReaderTb4b4b4(Te6edf3firmwareZipBlobTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3zipReader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3ZipReaderTb4b4b4(Te6edf3blobReaderTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3zipEntries Tff7b72= Tff7b72await Te6edf3zipReaderTb4b4b4.Te6edf3getEntriesTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// find manifest file
Tff7b72const Te6edf3manifestFile Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Ta5d6ff"manifest.json"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3manifestFileTb4b4b4) Tb4b4b4{
Tff7b72throw Ta5d6ff"manifest.json not found in firmware file!"Tb4b4b4;
Tb4b4b4}
T8b949e// read manifest file as text
Tff7b72const Te6edf3text Tff7b72= Tff7b72await Te6edf3manifestFileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3TextWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// parse manifest json
Tff7b72const Te6edf3json Tff7b72= Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3manifest Tff7b72= Te6edf3jsonTb4b4b4.Te6edf3manifestTb4b4b4;
T8b949e// todo softdevice_bootloader
T8b949e// if self.manifest.softdevice_bootloader:
T8b949e// self._dfu_send_image(HexType.SD_BL, self.manifest.softdevice_bootloader)
T8b949e// todo softdevice
T8b949e// if self.manifest.softdevice:
T8b949e// self._dfu_send_image(HexType.SOFTDEVICE, self.manifest.softdevice)
T8b949e// todo bootloader
T8b949e// if self.manifest.bootloader:
T8b949e// self._dfu_send_image(HexType.BOOTLOADER, self.manifest.bootloader)
T8b949e// flash application image
Tff7b72if Tb4b4b4(Te6edf3manifestTb4b4b4.Te6edf3applicationTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3dfuSendImageTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3HEX_TYPE_APPLICATIONTb4b4b4, Te6edf3zipEntriesTb4b4b4, Te6edf3manifestTb4b4b4.Te6edf3applicationTb4b4b4, Te6edf3progressCallbackTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Sends the firmware image to the device in DFU mode.
* @param programMode
* @param zipEntries
* @param firmwareManifest
* @param progressCallback
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3dfuSendImageTb4b4b4(Te6edf3programModeTb4b4b4, Te6edf3zipEntriesTb4b4b4, Te6edf3firmwareManifestTb4b4b4, Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
T8b949e// open port
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3serialPortTb4b4b4.Te6edf3openTb4b4b4(Tb4b4b4{
Te6edf3baudRateTff7b72: Tff7b72thisTb4b4b4.Te6edf3FLASH_BAUDTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// wait SERIAL_PORT_OPEN_WAIT_TIME
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3SERIAL_PORT_OPEN_WAIT_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
T8b949e// file sizes
Tff7b72var Te6edf3softdeviceSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72var Te6edf3bootloaderSize Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72var Te6edf3applicationSize Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// read bin file (firmware)
Tff7b72const Te6edf3binFile Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Te6edf3firmwareManifestTb4b4b4.Te6edf3bin_fileTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3firmware Tff7b72= Tff7b72await Te6edf3binFileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3Uint8ArrayWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// read dat file (init packet)
Tff7b72const Te6edf3datFile Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Te6edf3firmwareManifestTb4b4b4.Te6edf3dat_fileTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3init_packet Tff7b72= Tff7b72await Te6edf3datFileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3Uint8ArrayWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// only support flashing application for now
Tff7b72if Tb4b4b4(Te6edf3programMode Tff7b72!== Tff7b72thisTb4b4b4.Te6edf3HEX_TYPE_APPLICATIONTb4b4b4) Tb4b4b4{
Tff7b72throw Ta5d6ff"not implemented"Tb4b4b4;
Tb4b4b4}
T8b949e// determine application size
Tff7b72if Tb4b4b4(Te6edf3programMode Tff7b72=== Tff7b72thisTb4b4b4.Te6edf3HEX_TYPE_APPLICATIONTb4b4b4) Tb4b4b4{
Te6edf3applicationSize Tff7b72= Te6edf3firmwareTb4b4b4.Te6edf3lengthTb4b4b4;
Tb4b4b4}
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Sending DFU start packet"Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendStartDfuTb4b4b4(Te6edf3programModeTb4b4b4, Te6edf3softdeviceSizeTb4b4b4, Te6edf3bootloaderSizeTb4b4b4, Te6edf3applicationSizeTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Sending DFU init packet"Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendInitPacketTb4b4b4(Te6edf3init_packetTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Sending firmware"Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendFirmwareTb4b4b4(Te6edf3firmwareTb4b4b4, Te6edf3progressCallbackTb4b4b4)Tb4b4b4;
T8b949e// todo
T8b949e// sleep(self.dfu_transport.get_activate_wait_time())
Tb4b4b4}
T8b949e/**
* Calculates CRC16 on the provided binaryData
* @param {Uint8Array} binaryData - Array with data to run CRC16 calculation on
* @param {number} crc - CRC value to start calculation with
* @return {number} - Calculated CRC value of binaryData
*/
Te6edf3calcCrc16Tb4b4b4(Te6edf3binaryDataTb4b4b4, Te6edf3crc Tff7b72= T79c0ff0xffffTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Te6edf3binaryData Tff7b72instanceof Tffa657Uint8ArrayTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"calcCrc16 requires Uint8Array input"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3b Tff7b72of Te6edf3binaryDataTb4b4b4) Tb4b4b4{
Te6edf3crc Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72>> T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0x00ffTb4b4b4) Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72& T79c0ff0xff00Tb4b4b4)Tb4b4b4;
Te6edf3crc Tff7b72^= Te6edf3bTb4b4b4;
Te6edf3crc Tff7b72^= Tb4b4b4(Te6edf3crc Tff7b72& T79c0ff0x00ffTb4b4b4) Tff7b72>> T79c0ff4Tb4b4b4;
Te6edf3crc Tff7b72^= Tb4b4b4(Te6edf3crc Tff7b72<< T79c0ff8Tb4b4b4) Tff7b72<< T79c0ff4Tb4b4b4;
Te6edf3crc Tff7b72^= Tb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72& T79c0ff0x00ffTb4b4b4) Tff7b72<< T79c0ff4Tb4b4b4) Tff7b72<< T79c0ff1Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3crc Tff7b72& T79c0ff0xffffTb4b4b4;
Tb4b4b4}
T8b949e/**
* Encode esc characters in a SLIP package.
* Replace 0xC0 with 0xDBDC and 0xDB with 0xDBDD.
* @param dataIn
* @returns {*[]}
*/
Te6edf3slipEncodeEscCharsTb4b4b4(Te6edf3dataInTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3result Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3dataInTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72let Tff7b72char Tff7b72= Te6edf3dataInTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72char Tff7b72=== T79c0ff0xc0Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xdcTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tff7b72char Tff7b72=== T79c0ff0xdbTb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xdbTb4b4b4)Tb4b4b4;
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(T79c0ff0xddTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3pushTb4b4b4(Tff7b72charTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
T8b949e/**
* Creates an HCI packet from the provided frame data.
* https://github.com/adafruit/Adafruit_nRF52_nrfutil/blob/master/nordicsemi/dfu/dfu_transport_serial.py#L332
* @param frame
* @returns {*[]}
*/
Te6edf3createHciPacketFromFrameTb4b4b4(Te6edf3frameTb4b4b4) Tb4b4b4{
T8b949e// increase sequence number, but roll over at 8
Tff7b72thisTb4b4b4.Te6edf3sequenceNumber Tff7b72= Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3sequenceNumber Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72% T79c0ff8Tb4b4b4;
T8b949e// create slip header
Tff7b72const Te6edf3slipHeaderBytes Tff7b72= Tff7b72thisTb4b4b4.Te6edf3createSlipHeaderTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3sequenceNumberTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3DATA_INTEGRITY_CHECK_PRESENTTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3RELIABLE_PACKETTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3HCI_PACKET_TYPETb4b4b4,
Te6edf3frameTb4b4b4.Te6edf3length
Tb4b4b4)Tb4b4b4;
T8b949e// create packet data
Tff7b72let Te6edf3data Tff7b72= Tb4b4b4[Tb4b4b4...Te6edf3slipHeaderBytesTb4b4b4, Tb4b4b4...Te6edf3frameTb4b4b4]Tb4b4b4;
T8b949e// add crc of data
Tff7b72const Te6edf3crc Tff7b72= Tff7b72thisTb4b4b4.Te6edf3calcCrc16Tb4b4b4(Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4, T79c0ff0xffffTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3crc Tff7b72& T79c0ff0xffTb4b4b4)Tb4b4b4;
Te6edf3dataTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4(Te6edf3crc Tff7b72& T79c0ff0xff00Tb4b4b4) Tff7b72>> T79c0ff8Tb4b4b4)Tb4b4b4;
T8b949e// add escape characters
Tff7b72return Tb4b4b4[T79c0ff0xc0Tb4b4b4, Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3slipEncodeEscCharsTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4, T79c0ff0xc0Tb4b4b4]Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Calculate how long we should wait for erasing data.
* @returns {number}
*/
Te6edf3getEraseWaitTimeTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// always wait at least 0.5 seconds
Tff7b72return Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff0.5Tb4b4b4, Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3total_size Tff7b72/ Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_SIZE Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_ERASE_TIMETb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Constructs the image size packet sent in the DFU Start packet.
* @param softdeviceSize
* @param bootloaderSize
* @param appSize
* @returns {number[]}
*/
Te6edf3createImageSizePacketTb4b4b4(Te6edf3softdeviceSize Tff7b72= T79c0ff0Tb4b4b4, Te6edf3bootloaderSize Tff7b72= T79c0ff0Tb4b4b4, Te6edf3appSize Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3softdeviceSizeTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3bootloaderSizeTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3appSizeTb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Sends the DFU Start packet to the device.
* @param mode
* @param softdevice_size
* @param bootloader_size
* @param app_size
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sendStartDfuTb4b4b4(Te6edf3modeTb4b4b4, Te6edf3softdevice_size Tff7b72= T79c0ff0Tb4b4b4, Te6edf3bootloader_size Tff7b72= T79c0ff0Tb4b4b4, Te6edf3app_size Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
T8b949e// create frame
Tff7b72const Te6edf3frame Tff7b72= Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_START_PACKETTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Te6edf3modeTb4b4b4)Tb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3createImageSizePacketTb4b4b4(Te6edf3softdevice_sizeTb4b4b4, Te6edf3bootloader_sizeTb4b4b4, Te6edf3app_sizeTb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4;
T8b949e// send hci packet
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Te6edf3frameTb4b4b4)Tb4b4b4)Tb4b4b4;
T8b949e// remember file sizes for calculating erase wait time
Tff7b72thisTb4b4b4.Te6edf3sd_size Tff7b72= Te6edf3softdevice_sizeTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3total_size Tff7b72= Te6edf3softdevice_size Tff7b72+ Te6edf3bootloader_size Tff7b72+ Te6edf3app_sizeTb4b4b4;
T8b949e// wait for initial erase
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3getEraseWaitTimeTb4b4b4(Tb4b4b4) Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Sends the DFU Init packet to the device.
* @param initPacket
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sendInitPacketTb4b4b4(Te6edf3initPacketTb4b4b4) Tb4b4b4{
T8b949e// create frame
Tff7b72const Te6edf3frame Tff7b72= Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_INIT_PACKETTb4b4b4)Tb4b4b4,
Tb4b4b4...Te6edf3initPacketTb4b4b4,
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int16ToBytesTb4b4b4(T79c0ff0x0000Tb4b4b4)Tb4b4b4, T8b949e// padding required
Tb4b4b4]Tb4b4b4;
T8b949e// send hci packet
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Te6edf3frameTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Sends the firmware file to the device in multiple chunks.
* @param firmware
* @param progressCallback
* @returns {Promise<void>}
*/
Tff7b72async Te6edf3sendFirmwareTb4b4b4(Te6edf3firmwareTb4b4b4, Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3packets Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72var Te6edf3packetsSent Tff7b72= T79c0ff0Tb4b4b4;
T8b949e// chunk firmware into separate packets
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3firmwareTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3i Tff7b72+= Tff7b72thisTb4b4b4.Te6edf3DFU_PACKET_MAX_SIZETb4b4b4) Tb4b4b4{
Te6edf3packetsTb4b4b4.Te6edf3pushTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Tb4b4b4[
Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_DATA_PACKETTb4b4b4)Tb4b4b4,
Tb4b4b4...Te6edf3firmwareTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3iTb4b4b4, Te6edf3i Tff7b72+ Tff7b72thisTb4b4b4.Te6edf3DFU_PACKET_MAX_SIZETb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// send initial progress
Tff7b72if Tb4b4b4(Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Te6edf3progressCallbackTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// send each packet one after the other
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3packetsTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
T8b949e// send packet
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Te6edf3packetsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
T8b949e// wait a bit to allow device to write before sending next packet
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sleepMillisTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3FLASH_PAGE_WRITE_TIME Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4;
T8b949e// update progress
Te6edf3packetsSentTff7b72++Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3progressCallbackTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3progress Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3packetsSent Tff7b72/ Te6edf3packetsTb4b4b4.Te6edf3lengthTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4)Tb4b4b4;
Te6edf3progressCallbackTb4b4b4(Te6edf3progressTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
T8b949e// finished sending firmware, send DFU Stop Data packet
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3sendPacketTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3createHciPacketFromFrameTb4b4b4(Tb4b4b4[Tb4b4b4...Tff7b72thisTb4b4b4.Te6edf3int32ToBytesTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3DFU_STOP_DATA_PACKETTb4b4b4)Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Creates a SLIP header.
*
* For a description of the SLIP header go to:
* http://developer.nordicsemi.com/nRF51_SDK/doc/7.2.0/s110/html/a00093.html
*
* @param {number} seq - Packet sequence number
* @param {number} dip - Data integrity check
* @param {number} rp - Reliable packet
* @param {number} pktType - Payload packet
* @param {number} pktLen - Packet length
* @return {Uint8Array} - SLIP header
*/
Te6edf3createSlipHeaderTb4b4b4(Te6edf3seqTb4b4b4, Te6edf3dipTb4b4b4, Te6edf3rpTb4b4b4, Te6edf3pktTypeTb4b4b4, Te6edf3pktLenTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3ints Tff7b72= Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4]Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3seq Tff7b72| Tb4b4b4(Tb4b4b4(Tb4b4b4(Te6edf3seq Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72% T79c0ff8Tb4b4b4) Tff7b72<< T79c0ff3Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3dip Tff7b72<< T79c0ff6Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3rp Tff7b72<< T79c0ff7Tb4b4b4)Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3pktType Tff7b72| Tb4b4b4(Tb4b4b4(Te6edf3pktLen Tff7b72& T79c0ff0x000fTb4b4b4) Tff7b72<< T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Tb4b4b4(Te6edf3pktLen Tff7b72& T79c0ff0x0ff0Tb4b4b4) Tff7b72>> T79c0ff4Tb4b4b4;
Te6edf3intsTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Tb4b4b4(Tff7b72~Tb4b4b4(Te6edf3intsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72+ Te6edf3intsTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72+ Te6edf3intsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72& T79c0ff0xffTb4b4b4;
Tff7b72return Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3intsTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Converts the provided int32 to 4 bytes.
* @param num
* @returns {number[]}
*/
Te6edf3int32ToBytesTb4b4b4(Te6edf3numTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Te6edf3num Tff7b72& T79c0ff0x000000ffTb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0x0000ff00Tb4b4b4) Tff7b72>> T79c0ff8Tb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0x00ff0000Tb4b4b4) Tff7b72>> T79c0ff16Tb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0xff000000Tb4b4b4) Tff7b72>> T79c0ff24Tb4b4b4]Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Converts the provided int16 to 2 bytes.
* @param num
* @returns {number[]}
*/
Te6edf3int16ToBytesTb4b4b4(Te6edf3numTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Te6edf3num Tff7b72& T79c0ff0x00ffTb4b4b4, Tb4b4b4(Te6edf3num Tff7b72& T79c0ff0xff00Tb4b4b4) Tff7b72>> T79c0ff8Tb4b4b4]Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────